
package com.be.beadmin.product.service;

import com.be.beadmin.common.entity.PageEntity;
import com.be.beadmin.design.entity.Process;
import com.be.beadmin.product.dto.input.PlantCapacityCalendarDto;
import com.be.beadmin.product.dto.output.CapacityByBatchAndDayEx;
import com.be.beadmin.product.dto.output.DateRangeCapacity;
import com.be.beadmin.product.dto.output.PlantCapacityCalendarEx;
import com.be.beadmin.product.entity.PlantCapacityCalendar;
import com.be.beadmin.product.entity.ProductManufactInfor;
import com.be.beadmin.product.entity.UserWorkHourInfo;
import com.be.beadmin.project.entity.BatchPlan;
import com.be.beadmin.project.entity.BatchProduct;
import com.be.beadmin.service.entity.FactoryCalendar;
import org.springframework.data.domain.Page;

import java.util.Date;
import java.util.List;

/**
* @description 服务接口
* @author zjm
* @date 2023-03-26
**/
public interface PlantCapacityCalendarService {

    /**
    * 分页的查询接口
    * @param pageEntity
    * @return
    */
    Page<PlantCapacityCalendarEx> getPlantCapacityCalendarByPage(PageEntity pageEntity);

    /**
    * @param plantCapacityCalendarDto
    */
    void addPlantCapacityCalendar(PlantCapacityCalendarDto plantCapacityCalendarDto);

    /**
    * @param plantCapacityCalendarDto
    */
    void updatePlantCapacityCalendar(PlantCapacityCalendarDto plantCapacityCalendarDto);

    /**
    * @param id
    */
    void delPlantCapacityCalendar(String id);

    /**
    * 删除多个角色
    * @param ids
    */
    void delPlantCapacityCalendars (List<String> ids);

    /**
     * 生成该工序计划产能日历
     * @return
     */
    void generateCapacityCalendar(ProductManufactInfor productManufactInfor, BatchProduct bp, FactoryCalendar factoryCalendar, BatchPlan batchPlan);

    /**
     * 生成该工序实际产能日历
     * @return
     */
    void generateRealCapacityCalendar(ProductManufactInfor productManufactInfor, UserWorkHourInfo userWorkHourInfo, BatchProduct bp, FactoryCalendar factoryCalendar, BatchPlan batchPlan);



    /**
     * 更新计划产能日历
     * @param batchProduct
     */
    void updatePlantCapCalender(BatchProduct batchProduct,BatchPlan batchPlan);


    /**
     * 按批次更新计划产能日历
     */
    void updatePlantCapCalenderByBatchPlan(BatchPlan batchPlan);

    /**
     * 更新实际产能日历
     * @param batchProduct
     */
    void updateRealPlantCapCalender(BatchProduct batchProduct,BatchPlan batchPlan);

    /**
     * 按批次更新实际产能日历
     */
    void updateRealPlantCapCalenderByBatchPlan(BatchPlan batchPlan);



    void updateRealPlantCapCalenderByBatchPlan(ProductManufactInfor productManufactInfor);
    /**
     * 生成某天某个工序的计划产能负荷
     * @param date
     * @param process
     * @return
     */
    Float computeCapacitySumByDay(Date date, Process process);
    /**
     * 生成某天某个工序的实际产能负荷
     * @param date
     * @param process
     * @return
     */
    Float computeRealCapacitySumByDay(Date date, Process process);

    /**
     * 生成某天 再指定范围的计划产能负荷
     * @param date 开始日期或结束日期
     * @param range 指定日期的天数范围， 正数表示date向后range天数， 负数表示date向前range天数
     * @param process 指定工序， 若为null， 则表示全部工序之和
     * @return
     */
    List<DateRangeCapacity> computeCapacitySumByDayAndRange(Date date, int range, Process process);



    /**
     * 生成某天 再指定范围的实际产能负荷
     * @param date 开始日期或结束日期
     * @param range 指定日期的天数范围， 正数表示date向后range天数， 负数表示date向前range天数
     * @param process 指定工序， 若为null， 则表示全部工序之和
     * @return
     */
    List<DateRangeCapacity> computeRealCapacitySumByDayAndRange(Date date, int range, Process process);

    /**
     * 获取产能日历数据 - 按照批次统计
     * @param pageEntity
     * @return
     */
    Page<CapacityByBatchAndDayEx> getPlantCapacityCalendarByPageAndBatch(PageEntity pageEntity);

    /**
     * 获取产能日历数据
     * @return
     */
    List<CapacityByBatchAndDayEx> getCapacityByBatch();

    void delPlantCapacityCalendarsByBatchPlan(BatchPlan batchPlan);

    /**
     * 根据柜体编码获取工时对比信息
     * @param productCode
     * @return
     */
    List<PlantCapacityCalendar> getWorkingHoursComparisonsByProductCode(String productCode);
}